package main

import (
	"fmt"
	"runtime"
)

func main() {
	//Caller 报告有关调用 goroutine 堆栈上的函数调用的文件和行号信息。 参数 skip 是要上升的堆栈帧数，0 标识 Caller 的调用者。
	//（由于历史原因，调用者和调用者之间跳过的含义不同。）返回值报告相应调用的文件中的程序计数器、文件名和行号。
	//如果无法恢复信息，则布尔值 ok 为 false。
	_, file, line, ok := runtime.Caller(0)
	if ok {
		fmt.Printf("The File :%s, Line: %d", file, line)
	}

	//调用者用调用 goroutine 堆栈上的函数调用的返回程序计数器填充切片 pc。
	//参数 skip 是在 pc 中记录之前要跳过的堆栈帧数，0 标识调用者本身的帧，1 标识调用者的调用者。 它返回写入 pc 的条目数。
	//
	//要将这些 PC 转换为符号信息，例如函数名称和行号，请使用 CallersFrames。
	//CallersFrames 考虑内联函数并将返回程序计数器调整为调用程序计数器。
	//不鼓励直接迭代返回的 PC 片，就像在任何返回的 PC 上使用 FuncForPC 一样，因为这些无法解释内联或返回程序计数器调整

	var p = make([]uintptr, 100)

	runtime.Callers(0, p)
}
